/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import bean.Apoio;
import bean.Autor;
import bean.Editora;
import bean.Obra;
import com.sun.faces.facelets.tag.jsf.core.LoadBundleHandler;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author fernando
 */
public class ObraDao implements Serializable {

    public ObraDao() {
        this.conexao = new ConexaoPostgres();
    }

    public Conexao getConexao() {
        return conexao;
    }

    public void setConexao(Conexao conexao) {
        this.conexao = conexao;
    }

    public PreparedStatement getPs() {
        return ps;
    }

    public void setPs(PreparedStatement ps) {
        this.ps = ps;
    }

    public boolean isSucess() {
        return sucess;
    }

    public void setSucess(boolean sucess) {
        this.sucess = sucess;
    }

    public List<Obra> listar() {
        List<Obra> obras = new ArrayList<Obra>();
        LivroDao livroDao = new LivroDao();
        LivroOrganizadoDao livroODao = new LivroOrganizadoDao();
        ArtigoDao artigoDao = new ArtigoDao();
        CapituloDao capituloDao = new CapituloDao();

        obras.addAll(livroDao.listarLivros());
        obras.addAll(livroODao.listarLivros());
        obras.addAll(artigoDao.listarArtigos());
        obras.addAll(capituloDao.listarCapitulos());


        return obras;

    }
    
    public List<Obra> listarObrasSimplificado()

    {
        ArrayList<Obra> obras = new ArrayList<Obra>();
        try {
            ps = conexao.getConnection().prepareStatement("SELECT id, titulo, tipo FROM obra WHERE tipo != 'Anais' AND tipo != 'Periodico' ");
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            
            while (rs.next()) {
                Obra o = new Obra();
                o.setId(rs.getInt("id"));
                o.setTitulo(rs.getString("titulo"));
                o.setTipo(rs.getString("tipo"));
                obras.add(o);
            }
            

        } catch (SQLException ex) {
            Logger.getLogger(ObraDao.class.getName()).log(Level.SEVERE, null, ex);
        }
        return obras;


    }

    public int numeroObrasCadastradas() {
        int totalObras = 0;
        try {
            ps = conexao.getConnection().prepareStatement("SELECT count(*) FROM obra WHERE tipo != 'Anais' AND tipo != 'Periodico' ");
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();

            if (rs.next()) {
                totalObras = rs.getInt("count");
            }
        } catch (SQLException ex) {
            Logger.getLogger(ObraDao.class.getName()).log(Level.SEVERE, null, ex);
        }
        return totalObras;
    }

    public Obra consultaObra(int id) {

        Obra obraConsultada = new Obra();
        try {
            System.out.println("ObraDao - consultarObra - Fui Executado! id obra = " + id);
            ps = conexao.getConnection().prepareStatement("SELECT * FROM obra where id = ?");
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();


            if (rs.next()) {
                obraConsultada.setId(id);
                obraConsultada.setTipo(rs.getString("tipo"));
                System.out.println("ObraDao - ConsultarObra - obraConsultada tipo: " + obraConsultada.getTipo());

                if (obraConsultada.getTipo().equals("Artigo")) {
                    ArtigoDao ad = new ArtigoDao();
                    obraConsultada = ad.buscarArtigos(id);
                    return obraConsultada;
                } else if (obraConsultada.getTipo().equals("Capítulo")) {
                    CapituloDao cp = new CapituloDao();
                    obraConsultada = cp.buscarCapitulo(id);
                    return obraConsultada;
                } else if (obraConsultada.getTipo().equals("Periodico")) {
                    PeriodicoDao pd = new PeriodicoDao();
                    obraConsultada = pd.consultaPeriodico(id);
                    return obraConsultada;
                } else if (obraConsultada.getTipo().equals("Anais")) {
                    AnaisDao ad = new AnaisDao();
                    obraConsultada = ad.consultaAnais(id);
                    return obraConsultada;

                } else if (obraConsultada.getTipo().equals("Livro Organizado")) {
                    LivroOrganizadoDao lod = new LivroOrganizadoDao();
                    obraConsultada = lod.consultaLivro(id);
                    return obraConsultada;
                } else if (obraConsultada.getTipo().equals("Livro")) {
                    LivroDao ld = new LivroDao();
                    obraConsultada = ld.buscarLivro(id);
                    return obraConsultada;
                } else {
                    System.out.println("ObraDAO - Consulta Obra - Não Foi encontrada! ");
                }



            }
        } catch (SQLException ex) {
            Logger.getLogger(ObraDao.class.getName()).log(Level.SEVERE, null, ex);
        }



        return obraConsultada;

    }

    public List<Obra> consultaObraFiltro(String filtro1, String filtro1limitador, String filtro2, String filtro2limitador, String filtro3,
            String filtro3limitador, String filtro4, String filtro4limitador,
            Apoio filtroApoio, Autor filtroAutor, Editora filtroEditora) {

        List<Obra> obrasConsulta = new ArrayList<Obra>();
        String consulta = "SELECT DISTINCT obra.id, obra.tipo FROM obra ";
        String fromAutor = "";
        String fromApoio = "";
        String fromEditora = "";
        String whereApoio = "";
        String whereAutor = "";
        String whereEditora = "";
        String whereFiltro1 = "";
        String whereFiltro2 = "";
        String whereFiltro3 = "";



        if (filtroApoio.getId() != 0) {
            fromApoio = ", obra_apoio, apoio_formento ";
            whereApoio = "( (apoio_formento.id = " + filtroApoio.getId() + " ) and (apoio_formento.id = obra_apoio.id_apoio) and (obra.id = obra_apoio.id_obra)  ) ";

        }
        if (filtroAutor.getId() != 0) {
            fromAutor = ", obra_autor, autor, livro_organizadores  ";
            whereAutor = " (((autor.id = " + filtroAutor.getId() + " ) and (autor.id = obra_autor.id_autor) and ( obra.id = obra_autor.id_obra) ) or ( (autor.id = " + filtroAutor.getId() + " ) and (obra.id = livro_organizadores.id_obra) and ( autor.id = livro_organizadores.id_organizador)))    ";

        }
        if (filtroEditora.getId() != 0) {
            fromEditora = ", editora ";
            whereEditora = " ((editora.id = " + filtroEditora.getId() + " ) and (obra.id_editora = editora.id)) ";

        }
        System.out.println(filtro1);
        if ((!filtro1limitador.equalsIgnoreCase("")) && (!filtro1.equalsIgnoreCase("naoSelecionado"))) {
            if ((filtro1.equalsIgnoreCase("titulo")) || ((filtro1.equalsIgnoreCase("issn_isbn")))) {
                whereFiltro1 = filtro1 + " = " + "'" + filtro1limitador + "'";
            } else {
                whereFiltro1 = filtro1 + " = " + filtro1limitador;
            }
        }
        if ((!filtro2limitador.equalsIgnoreCase("")) && (!filtro2.equalsIgnoreCase("naoSelecionado"))) {
            if ((filtro2.equalsIgnoreCase("titulo")) || ((filtro2.equalsIgnoreCase("issn_isbn")))) {
                whereFiltro2 = filtro2 + " = " + "'" + filtro2limitador + "'";
            } else {
                whereFiltro2 = filtro2 + " = " + filtro2limitador;
            }
        }
        if ((!filtro3limitador.equalsIgnoreCase("")) && (!filtro3.equalsIgnoreCase("naoSelecionado"))) {
            if ((filtro3.equalsIgnoreCase("titulo")) || ((filtro3.equalsIgnoreCase("issn_isbn")))) {
                whereFiltro3 = filtro3 + " = " + "'" + filtro3limitador + "'";
            } else {
                whereFiltro3 = filtro3 + " = " + filtro3limitador;
            }
        }



        if (!fromApoio.isEmpty()) {
            consulta = consulta + fromApoio;

        }
        if (!fromAutor.isEmpty()) {
            consulta = consulta + fromAutor;

        }

        if (!fromEditora.isEmpty()) {
            consulta = consulta + fromEditora;

        }


        //consulta = consulta + " where ";

        if ((!whereApoio.isEmpty()) && (!whereAutor.isEmpty()) && (!whereEditora.isEmpty())) {
            consulta = consulta + " where ";
            consulta = consulta + whereApoio + " and " + whereAutor + " and " + whereEditora;
        } else if ((!whereApoio.isEmpty()) && (!whereAutor.isEmpty()) && (whereEditora.isEmpty())) {
            consulta = consulta + " where ";
            consulta = consulta + whereApoio + " and " + whereAutor;
        } else if ((!whereApoio.isEmpty()) && (whereAutor.isEmpty()) && (!whereEditora.isEmpty())) {
            consulta = consulta + " where ";
            consulta = consulta + whereAutor + " and " + whereEditora;
        } else if ((!whereApoio.isEmpty()) && (whereAutor.isEmpty()) && (whereEditora.isEmpty())) {
            consulta = consulta + " where ";
            consulta = consulta + whereApoio;

        } else if ((whereApoio.isEmpty()) && (!whereAutor.isEmpty()) && (!whereEditora.isEmpty())) {
            consulta = consulta + " where ";
            consulta = consulta + whereAutor + " and " + whereEditora;
        } else if ((whereApoio.isEmpty()) && (!whereAutor.isEmpty()) && (whereEditora.isEmpty())) {
            consulta = consulta + " where ";
            consulta = consulta + whereAutor;
        } else if ((whereApoio.isEmpty()) && (whereAutor.isEmpty()) && (!whereEditora.isEmpty())) {
            consulta = consulta + " where ";
            consulta = consulta + whereEditora;
        }

        if ((whereApoio.isEmpty()) && (whereAutor.isEmpty()) && (whereEditora.isEmpty())) {

            if ((!whereFiltro1.isEmpty()) && (!whereFiltro2.isEmpty()) && (!whereFiltro3.isEmpty())) {
                consulta = consulta + " where ";
                consulta = consulta + whereFiltro1 + " and " + whereFiltro2 + " and " + whereFiltro3;

            } else if ((!whereFiltro1.isEmpty()) && (!whereFiltro2.isEmpty()) && (whereFiltro3.isEmpty())) {
                consulta = consulta + " where ";
                consulta = consulta + whereFiltro1 + " and " + whereFiltro2;

            } else if ((!whereFiltro1.isEmpty()) && (whereFiltro2.isEmpty()) && (!whereFiltro3.isEmpty())) {
                consulta = consulta + " where ";
                consulta = consulta + whereFiltro1 + " and " + whereFiltro3;

            } else if ((!whereFiltro1.isEmpty()) && (whereFiltro2.isEmpty()) && (whereFiltro3.isEmpty())) {
                consulta = consulta + " where ";
                consulta = consulta + whereFiltro1;


            } else if ((whereFiltro1.isEmpty()) && (!whereFiltro2.isEmpty()) && (!whereFiltro3.isEmpty())) {
                consulta = consulta + " where ";
                consulta = consulta + whereFiltro2 + " and " + whereFiltro3;

            } else if ((whereFiltro1.isEmpty()) && (!whereFiltro2.isEmpty()) && (whereFiltro3.isEmpty())) {
                consulta = consulta + " where ";
                consulta = consulta + whereFiltro2;

            } else if ((whereFiltro1.isEmpty()) && (whereFiltro2.isEmpty()) && (!whereFiltro3.isEmpty())) {
                consulta = consulta + " where ";
                consulta = consulta + whereFiltro3;

            } else if ((whereFiltro1.isEmpty()) && (whereFiltro2.isEmpty()) && (whereFiltro3.isEmpty())) {
                System.out.println("Nenhum filtro adicional inserido!");

            }

        } else if ((!whereFiltro1.isEmpty()) && (!whereFiltro2.isEmpty()) && (!whereFiltro3.isEmpty())) {
            consulta = consulta + " and ";
            consulta = consulta + whereFiltro1 + " and " + whereFiltro2 + " and " + whereFiltro3;

        } else if ((!whereFiltro1.isEmpty()) && (!whereFiltro2.isEmpty()) && (whereFiltro3.isEmpty())) {
            consulta = consulta + " and ";
            consulta = consulta + whereFiltro1 + " and " + whereFiltro2;

        } else if ((!whereFiltro1.isEmpty()) && (whereFiltro2.isEmpty()) && (!whereFiltro3.isEmpty())) {
            consulta = consulta + " and ";
            consulta = consulta + whereFiltro1 + " and " + whereFiltro3;

        } else if ((!whereFiltro1.isEmpty()) && (whereFiltro2.isEmpty()) && (whereFiltro3.isEmpty())) {
            consulta = consulta + " and ";
            consulta = consulta + whereFiltro1;


        } else if ((whereFiltro1.isEmpty()) && (!whereFiltro2.isEmpty()) && (!whereFiltro3.isEmpty())) {
            consulta = consulta + " and ";
            consulta = consulta + whereFiltro2 + " and " + whereFiltro3;

        } else if ((whereFiltro1.isEmpty()) && (!whereFiltro2.isEmpty()) && (whereFiltro3.isEmpty())) {
            consulta = consulta + " and ";
            consulta = consulta + whereFiltro2;

        } else if ((whereFiltro1.isEmpty()) && (whereFiltro2.isEmpty()) && (!whereFiltro3.isEmpty())) {
            consulta = consulta + " and ";
            consulta = consulta + whereFiltro3;

        } else if ((whereFiltro1.isEmpty()) && (whereFiltro2.isEmpty()) && (whereFiltro3.isEmpty())) {
            System.out.println("Nenhum filtro adicional inserido!");

        }


        if (consulta.contains("and")) {
            consulta = consulta + " and tipo != 'Anais' AND tipo != 'Periodico'";
        } else if (consulta.contains("where")) {
            consulta = consulta + " and tipo != 'Anais' AND tipo != 'Periodico'";
        } else {
            consulta = consulta + " where tipo != 'Anais' AND tipo != 'Periodico'";
        }


        System.out.println("ObraDao - ConsultaObraFiltro" + consulta);
        try {
            ps = conexao.getConnection().prepareStatement(consulta);
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();

            while (rs.next()) {
                Obra o = new Obra();
                o = this.consultaObra(rs.getInt("id"));
                System.out.println("Obra Tipo: " + o.getTipo());
                if (!((o.getTipo().equalsIgnoreCase("Anais")) || (o.getTipo().equals("Periodico")))) {
                    obrasConsulta.add(o);
                }
            }
        } catch (SQLException ex) {
            Logger.getLogger(ObraDao.class.getName()).log(Level.SEVERE, null, ex);
        }



        return obrasConsulta;

    }
    private Conexao conexao;
    private PreparedStatement ps;
    private boolean sucess = false;
}
